#include <iostream>
using namespace std;

void Swap(int &rx, int &ry) // 之前我们是没有&这个稍微，那么这里的参数就是a和b的拷贝
// 因为是传值所以是不能进行根本性的交换的
// 所以我们在进行交换函数的时候我们是要传地址的，使用指针的

// 那么现在我们在函数的定义中我们直接将a的别名和b的别名定义在里面
// 那么因为rx是a的别名，ry是b的别名，那么我们通过这两个别名就能访问他们的地址了
// 并且我们在这个主函数里面我们在进行交换函数的时候我们是不需要进行取地址的操作的
// 因为我们的函数传的参是a  那么我们为a取别名叫rx  那么rx就是a

// 那么rx和ry的交换就是a和e的交换

// 那么就是形参的改变就改变了实参
{
    int tmp = rx;
    rx = ry;
    ry = tmp;
}
int main()
{
    int a = 0;
    // int b = a;//将a赋值给b

    int &b = a; // 给a的这块空间取别名。叫b

    int &c = a; // 再给a取别名叫c

    int &d = b; // 也可以给b取别名

    // 其实就是这么一块空间有多个名字

    cout << &a << endl;
    cout << &b << endl;
    cout << &c << endl;
    cout << &d << endl;
    // 这四个变量的地址都是一样的
    b++;
    // 那么我们进行b++的话，a c d 的大小都会被改变的

    // 我们还能给指针p1取别名
    int *p1 = &a;
    int *&p2 = p1;
    cout << p1 << endl;
    cout << p2 << endl;
    int e = 10;
    p2 = &e; // 将p2改变指向从a变成e
    // 因为p1就是p2
    // 那么随着p2的改变，那么p1也改变了
    cout << *p1 << endl;

    int x = 0, y = 1;
    cout << x << " " << y << endl;
    Swap(x, y);
    cout << x << " " << y << endl;
    return 0;
}

// 我们这里是给变量取别名
// 但是typedef是给类型取别名
// typedef int type
//
// define是定义宏

//&这个在c语言中是取地址的符号，但是我们在这里是引用的意思
// 就是给这个变量起个小名

// 引用是不能替代指针的